package jiuxing

import (
	//"charge/sysmap"
	"encoding/binary"
	"encoding/hex"
	"fmt"
	"strconv"

	"github.com/axgle/mahonia"
)

type Item []byte

func NewByteArray(in []byte) Item {
	return in
}

func (array Item) ByteArray(start, l int) Item {
	return array[start : start+l]
}

func (im Item) ToUInt64() uint64 {
	return binary.LittleEndian.Uint64(im)
}

func (im Item) ToUInt32() uint32 {
	return binary.LittleEndian.Uint32(im)
}

func (im Item) ToUInt16() uint16 {
	return binary.LittleEndian.Uint16(im)
}

func (im Item) ToUInt8() uint8 {
	return im[0]
}

func (im Item) ToUInt64String() string {
	return strconv.Itoa(int(binary.LittleEndian.Uint64(im)))
}

func (im Item) ToUInt32String() string {
	return strconv.Itoa(int(binary.LittleEndian.Uint32(im)))
}

func (im Item) ToUInt16String() string {
	return strconv.Itoa(int(binary.LittleEndian.Uint16(im)))
}

func (im Item) ToUInt8String() string {
	return strconv.Itoa(int(im[0]))
}

func (im Item) ToString() string {
	out := []byte{}
	for _, char := range im {
		if char == 0 {
			break
		}
		out = append(out, char)
	}
	return string(out)
}

func (im Item) ToHexString() string {
	return hex.EncodeToString(im)
}

func (im Item) ToMapString(m map[int]string) string {
	key := int(im[0])
	if v, ok := m[key]; ok {
		return v
	} else {
		return ""
	}
}

func (im Item) Totime() string {
	if len(im) < 6 {
		return ""
	}
	year := int(im[0])
	mouth := int(im[1])
	day := int(im[2])
	hour := int(im[3])
	min := int(im[4])
	sec := int(im[5])
	return fmt.Sprintf("%d-%d-%d %d:%d:%d", year, mouth, day, hour, min, sec)
}

// func (im Item) MapValue(m string, begein int) string {
// 	key := int(im.ByteArray(begein, 1).ToUInt8())
// 	return sysmap.GetMapvalue("ctlType", key)
// }

func (im Item) GbkString(begein, len int) string {
	decoder := mahonia.NewDecoder("GBK")
	msg := im.ByteArray(begein, len).ToString()
	return decoder.ConvertString(msg)
}

func (im Item) GetString(begein, len int) string {
	return im.ByteArray(begein, len).ToString()
}

func (im Item) GetUint32(begein int) uint32 {
	return im.ByteArray(begein, 4).ToUInt32()
}

func (im Item) Get3ByteUint32(begein int) uint32 {
	return uint32(im.GetUint16(begein)) + uint32(im.GetUint8(begein+2))*65536
}

func (im Item) GetUint16(begein int) uint16 {
	arry := im.ByteArray(begein, 2)
	return arry.ToUInt16()
}

func (im Item) GetUint8(begein int) uint8 {
	return im.ByteArray(begein, 1).ToUInt8()
}

func (im Item) GetUint32String(begein int) string {
	return strconv.Itoa(int(im.ByteArray(begein, 4).ToUInt32()))
}

func (im Item) GetUint16String(begein int) string {
	return strconv.Itoa(int(im.ByteArray(begein, 2).ToUInt16()))
}

func (im Item) GetUint8String(begein int) string {
	return strconv.Itoa(int(im.ByteArray(begein, 1).ToUInt8()))
}

func (im Item) GetNumber(begein, len int) uint32 {
	switch len {
	case 4:
		return uint32(im.ByteArray(begein, 4).ToUInt32())
	case 2:
		return uint32(im.ByteArray(begein, 2).ToUInt16())
	case 1:
		return uint32(im.ByteArray(begein, 1).ToUInt8())
	default:
		return 0
	}
}

func (im Item) GetNumberString(begein, len int) string {
	return strconv.Itoa(int(im.GetNumber(begein, len)))
}

func (im Item) GetTimeArray(begin int) []byte {
	return im.ByteArray(begin, 6)
}
